package com.studyweb.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import java.util.Map;

/**
 * 邮件服务工具类
 * 
 * <p>提供完整的邮件发送功能，支持：</p>
 * <ul>
 *   <li>简单文本邮件发送</li>
 *   <li>HTML格式邮件发送</li>
 *   <li>基于Thymeleaf模板的邮件发送</li>
 *   <li>验证码邮件发送</li>
 *   <li>密码重置邮件发送</li>
 *   <li>欢迎邮件发送</li>
 * </ul>
 * 
 * @author StudyWeb Team
 * @since 1.0.0
 */
@Slf4j
@Component
public class EmailUtils {

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private TemplateEngine templateEngine;

    @Value("${spring.mail.username}")
    private String from;

    /**
     * 发送简单文本邮件
     * 
     * @param to 收件人邮箱地址
     * @param subject 邮件主题
     * @param content 邮件内容（纯文本）
     * @return boolean 发送是否成功
     */
    public boolean sendSimpleMail(String to, String subject, String content) {
        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(from);
            message.setTo(to);
            message.setSubject(subject);
            message.setText(content);
            
            mailSender.send(message);
            log.info("简单邮件发送成功，收件人: {}, 主题: {}", to, subject);
            return true;
        } catch (Exception e) {
            log.error("简单邮件发送失败，收件人: {}, 主题: {}, 错误: {}", to, subject, e.getMessage());
            return false;
        }
    }

    /**
     * 发送HTML格式邮件
     * 
     * @param to 收件人邮箱地址
     * @param subject 邮件主题
     * @param content HTML格式邮件内容
     * @return boolean 发送是否成功
     */
    public boolean sendHtmlMail(String to, String subject, String content) {
        try {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            
            mailSender.send(message);
            log.info("HTML邮件发送成功，收件人: {}, 主题: {}", to, subject);
            return true;
        } catch (MessagingException e) {
            log.error("HTML邮件发送失败，收件人: {}, 主题: {}, 错误: {}", to, subject, e.getMessage());
            return false;
        }
    }

    /**
     * 发送基于Thymeleaf模板的邮件
     * 
     * @param to 收件人邮箱地址
     * @param subject 邮件主题
     * @param templateName 模板文件名（不含扩展名）
     * @param variables 模板变量映射
     * @return boolean 发送是否成功
     */
    public boolean sendTemplateMail(String to, String subject, String templateName, Map<String, Object> variables) {
        try {
            Context context = new Context();
            context.setVariables(variables);
            
            String content = templateEngine.process(templateName, context);
            return sendHtmlMail(to, subject, content);
        } catch (Exception e) {
            log.error("模板邮件发送失败，收件人: {}, 主题: {}, 模板: {}, 错误: {}", to, subject, templateName, e.getMessage());
            return false;
        }
    }

    /**
     * 发送验证码邮件
     * 
     * @param to 收件人邮箱地址
     * @param code 验证码
     * @return boolean 发送是否成功
     * @apiNote 使用预定义的验证码邮件模板
     */
    public boolean sendVerificationCode(String to, String code) {
        String subject = "【学习网站】邮箱验证码";
        String content = String.format(
            "您好！\n\n" +
            "您的验证码是：%s\n\n" +
            "验证码有效期为5分钟，请及时使用。\n\n" +
            "如果这不是您的操作，请忽略此邮件。\n\n" +
            "学习网站团队",
            code
        );
        
        return sendSimpleMail(to, subject, content);
    }

    /**
     * 发送密码重置邮件
     * 
     * @param to 收件人邮箱地址
     * @param username 用户名
     * @param resetLink 密码重置链接
     * @return boolean 发送是否成功
     * @apiNote 使用预定义的密码重置邮件模板
     */
    public boolean sendPasswordResetMail(String to, String username, String resetLink) {
        String subject = "【学习网站】密码重置";
        String content = String.format(
            "亲爱的 %s：\n\n" +
            "您申请了密码重置，请点击以下链接重置您的密码：\n\n" +
            "%s\n\n" +
            "此链接有效期为30分钟，请及时使用。\n\n" +
            "如果这不是您的操作，请忽略此邮件。\n\n" +
            "学习网站团队",
            username, resetLink
        );
        
        return sendSimpleMail(to, subject, content);
    }

    /**
     * 发送欢迎邮件
     * 
     * @param to 收件人邮箱地址
     * @param username 用户名
     * @return boolean 发送是否成功
     * @apiNote 使用预定义的欢迎邮件模板
     */
    public boolean sendWelcomeMail(String to, String username) {
        String subject = "【学习网站】欢迎加入";
        String content = String.format(
            "亲爱的 %s：\n\n" +
            "欢迎加入学习网站！\n\n" +
            "我们为您提供优质的学习资源和服务，希望您在这里能够获得良好的学习体验。\n\n" +
            "如有任何问题，请随时联系我们的客服团队。\n\n" +
            "祝您学习愉快！\n\n" +
            "学习网站团队",
            username
        );
        
        return sendSimpleMail(to, subject, content);
    }
}